package br.com.ianalise.outros;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.text.SimpleDateFormat;

import br.com.ianalise.negocio.excecoes.IAnaliseException;

public class ThreadServer extends Thread {

	private static ThreadServer instancia = null;
	private Registry registry;
	private String status;
	private String porta;
	private boolean parar;
	private boolean servidorLigado;
	private ObjetoRemoto objetoRemoto;
	
	public static ThreadServer getInstancia(String porta) {
        if (instancia == null) {
                instancia = new ThreadServer(porta);
        }
        return instancia;
	}
	
	public ThreadServer(String porta) {
		super();
		this.porta = porta;
		setServidorLigado(false);
	}
	
	public void run() {
		//this.parar = false;
		try {
			setRegistry(LocateRegistry.createRegistry(Integer.parseInt(this.porta)));
			setStatus("["+new SimpleDateFormat("HH:mm:ss").format(new java.util.Date())+"] Servidor iniciado! Porta: "+this.porta);
			
			objetoRemoto = new ObjetoRemoto();
            Naming.rebind("iAnalise", objetoRemoto);
            
			setServidorLigado(true);
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			setStatus("["+new SimpleDateFormat("HH:mm:ss").format(new java.util.Date())+"] Algo deu errado: \n"+e.toString());
			setServidorLigado(false);
			try {
				throw new IAnaliseException(e.toString()+"\n\nO SERVIDOR NÃO FOI INICIALIZADO!\nNENHUM CLIENTE PODERÁ SE CONECTAR!\n\nTente mudar o número da porta nas configurações de rede.");
			} catch (IAnaliseException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			try {
				throw new IAnaliseException(e.toString());
			} catch (IAnaliseException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		}
		
		//encerrar a thread quando necessário
		//while (!isInterrupted()) {
		//}
		//return;
	}

	public Registry getRegistry() {
		return registry;
	}

	public void setRegistry(Registry registry) {
		this.registry = registry;
	}

	public String getStatus() {
		return status;
	}

	public void setStatus(String status) {
		this.status = status;
	}

	public String getPorta() {
		return porta;
	}

	public void setPorta(String porta) {
		this.porta = porta;
	}

	public boolean getParar() {
		return parar;
	}

	/*public void setParar() {
		this.parar = true;
		this.interrupt();
		instancia = null;
		try {
			UnicastRemoteObject.unexportObject(registry,true);
		} catch (NoSuchObjectException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			try {
				throw new IAnaliseException(e.toString());
			} catch (IAnaliseException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		} 
	}*/

	public boolean getServidorLigado() {
		return servidorLigado;
	}

	public void setServidorLigado(boolean servidorLigado) {
		this.servidorLigado = servidorLigado;
	}

}
